#define _CRT_SECURE_NO_WARNINGS 1
#include <functional>
#include <iostream>
using namespace std;
using  namespace placeholders;
//int f(int a, int b)
//{
//	cout << "int f(int a, int b)" << endl;
//	return a + b;
//}
//struct Functor
//{
//public:
//	int operator() (int a, int b)
//	{
//		cout << "int operator() (int a, int b)" << endl;
//		return a + b;
//	}
//};
//class Plus
//{
//public:
//	static int plusi(int a, int b)
//	{
//		return a + b;
//	}
//	double plusd(double a, double b)
//	{
//		return a + b;
//	}
//};
//int main()
//{
//	function<int(int, int)> f1 = f;
//	function<int(int, int)> f2 = Functor();
//	function<int(int, int)> f3 = [](int a, int b)->int {
//		cout << "[](int a, int b)->int" << endl;
//		return a + b;
//	};
//	//cout<<" "<<f1(1, 2);
//	//cout <<" "<<f2(1, 2);
//	//cout <<" "<< f3(1, 2);
//	function<int(int, int)> f4 = &Plus::plusi;
//	function<double(Plus,double, double)> f5 = &Plus::plusd;
//	function<double(Plus*, double, double)> f6= &Plus::plusd;
//	cout << f4(3, 4) << endl;
//	cout<<f5(Plus(), 4, 5);
//	Plus p;
//	f6(&p, 2, 4);
//	return 0;
//}

void Plus(int a, int b)
{
	cout << a << " ";
	cout << b << endl;
}
class Sub
{
public:
	int sub(int a, int b)
	{
		return a - b;
	}
};
//int main()
//{
//	/*int x = 10;
//	int y = 20;
//	function<void(int, int)> f1 = Plus;
//	auto b=bind(f1,_2, _1);
//	f1(x, y);
//	b(x, y);
//	cout<<typeid(bind(f1, _2, _1)).name()<<endl;*/
//
//
//	int x = 10;
//	int y = 20;
//	function<void()> f1 = bind(Plus, x, y);
//	//auto  f1 = bind(Plus, x, y);
//	f1();
//	Sub s;
//	function<int(int, int)> f2 = bind(&Sub::sub, s, _2, _1);
//	cout<<f2(2,10)<<endl;
//	function<int()> f3 = bind(&Sub::sub, Sub(), 10, 1);
//	cout<<f3()<<endl;
//	function<int(Sub, int, int)> f4 = &Sub::sub;
//	cout<<f4(Sub(), 1, 2);
//	
//	return 0;
//}
#include <mutex>
int main()
{
	int a = 10;
	function<void(void)> fun1([&a]()mutable->void {a++; });
	fun1();
	cout << a;
	mutex mtx = mutex();
	return 0;
}